"""
本模块用于生成符合短视频推荐算法需求的观看日志数据，包含以下15个核心字段：
1. vid：视频唯一标识（Video ID）
2. title：视频标题
3. category：视频分类信息
4. author：作者（上传者）昵称或ID
5. publish_time：发布时间（ISO 格式时间戳或Unix时间戳）
6. duration：视频时长（单位：毫秒）
7. likes：被点赞次数
8. favorites：被收藏次数
9. reposts：被转发/转载次数
10. labels：视频标签（通常是一个或多个标签，用逗号或分号分隔）
11. play_time：被播放次数（播放量）
12. play_duration：总播放时长（所有用户观看时长的总和，单位：毫秒）
13. is_like：当前用户是否已点赞（布尔值：1/0 或 true/false）
14. is_follow：当前用户是否已关注作者（布尔值：1/0 或 true/false）
15. is_share：当前用户是否已分享/转发（布尔值：1/0 或 true/false）
"""

import random
import pandas as pd
import numpy as np
import json
from datetime import datetime, timedelta
import sys

# 设置随机种子以确保结果可复现
np.random.seed(42)
random.seed(42)

# 输出大小参数
output_size = 2000
if len(sys.argv) > 1:
    output_size = int(sys.argv[1])

# 数据文件路径
video_file = 'short-video-recommandation-algorithms-master/data/video_1000_20250907.csv'
user_file = 'short-video-recommandation-algorithms-master/data/users_1000_20250907.csv'
viewlogs_file = 'short-video-recommandation-algorithms-master/data/viewlogs_2000_20250907.csv'

class EnhancedViewlogGenerator:
    def __init__(self, videos_df, users_df):
        self.videos_df = videos_df
        self.users_df = users_df

        # 用户类型配置（基于enhanced_p12的设置）
        self.user_types = {
            'heavy_user': {
                'daily_watch_count': (15, 30),
                'interaction_rates': {
                    'like_rate': 0.12,
                    'comment_rate': 0.04,
                    'favorite_rate': 0.06,
                    'repost_rate': 0.025
                }
            },
            'moderate_user': {
                'daily_watch_count': (6, 15),
                'interaction_rates': {
                    'like_rate': 0.08,
                    'comment_rate': 0.02,
                    'favorite_rate': 0.035,
                    'repost_rate': 0.015
                }
            },
            'light_user': {
                'daily_watch_count': (2, 6),
                'interaction_rates': {
                    'like_rate': 0.04,
                    'comment_rate': 0.01,
                    'favorite_rate': 0.02,
                    'repost_rate': 0.005
                }
            }
        }

        # 性别偏好权重（基于enhanced_p12的性别偏好设置）
        self.gender_preferences = {
            '男': {
                '颜值': 1.1, '萌宠': 0.8, '美食': 0.9, '音乐': 0.9, '美妆': 0.7, '穿搭': 0.8,
                '搞笑': 1.3, '科技': 1.4, '游戏': 1.5, '健身': 1.2, 'FPS': 1.6, 'MOBA': 1.5,
                '擦边': 1.8, '性感': 1.6, '诱惑': 1.7, '美女': 1.5, '身材': 1.4, '大长腿': 1.6,
                '小蛮腰': 1.5, '马甲线': 1.3, '腹肌': 1.2, '胸肌': 1.2, '翘臀': 1.4, '美腿': 1.5,
                '电竞': 1.7, '主播': 1.4, '直播': 1.3, '开黑': 1.6, '上分': 1.5, '排位': 1.5,
                '段位': 1.4, '王者': 1.6, '吃鸡': 1.5, 'LOL': 1.6, '王者荣耀': 1.5, '和平精英': 1.4,
                '原神': 1.3, '崩坏': 1.2, '明日方舟': 1.2, '阴阳师': 1.2, '操作': 1.5, '技巧': 1.4,
                '攻略': 1.6, '教学': 1.5, '解说': 1.4, '复盘': 1.3, '分析': 1.3, '战术': 1.4,
                '二次元': 1.3, '动漫': 1.2, '番剧': 1.2, '新番': 1.2, '完结': 1.1, '追番': 1.2,
                '补番': 1.1, '推荐': 1.1, '安利': 1.1, '手办': 1.2, '周边': 1.2, '同人': 1.1,
                'AMV': 1.1, 'MAD': 1.1, '高燃混剪': 1.2, 'CP混剪': 1.1
            },
            '女': {
                '颜值': 1.4, '萌宠': 1.3, '美食': 1.2, '音乐': 1.1, '美妆': 1.3, '穿搭': 1.2,
                '搞笑': 1.0, '科技': 0.7, '游戏': 0.8, '健身': 0.9, '宅舞': 1.2, '手势舞': 1.1,
                '写真': 1.5, '气质': 1.4, '妆造': 1.4, 'OOTD': 1.3, 'JK制服': 1.3, '汉服': 1.4,
                'cos': 1.2, '舞室练习': 1.2, '时尚': 1.3, '潮流': 1.2, '搭配': 1.3,
                '猫': 1.4, '狗': 1.3, '仓鼠': 1.2, '异宠': 1.1, '可爱': 1.4, '治愈': 1.3, '解压': 1.2,
                '萌宠日常': 1.3, '搞笑萌宠': 1.2, '萌宠搞笑君': 1.1, '萌娃': 1.2,
                '情感': 1.3, '恋爱': 1.2, '单身': 1.1, '脱单': 1.2, '分手': 1.1, '复合': 1.1,
                '前任': 1.1, '现任': 1.1, '暗恋': 1.2, '表白': 1.2, '被表白': 1.2, '拒绝': 1.1,
                '接受': 1.2, '异地恋': 1.1, '网恋': 1.1, '相亲': 1.1, '催婚': 1.1, '结婚': 1.1,
                '离婚': 1.1, '出轨': 1.1, '小三': 1.1, '渣男': 1.1, '渣女': 1.1, '绿茶': 1.1,
                '白莲花': 1.1, '家庭': 1.2, '父母': 1.2, '子女': 1.2, '情侣': 1.2, '朋友': 1.2,
                '闺蜜': 1.3, '兄弟': 1.1, '泪目': 1.2, '全程姨母笑': 1.2, '社死': 1.1, '尴尬癌': 1.1,
                '宿舍日常': 1.2, '打工日记': 1.1, '老板来了': 1.1, '熊孩子': 1.1
            }
        }

    def get_hour_weights(self, is_holiday=False):
        """获取24小时的观看权重（多峰分布，考虑假期影响）"""
        if is_holiday:
            # 假期模式：全天观看，下午和晚上高峰
            holiday_weights = [0.04] * 6 + [0.08] * 2 + [0.12] * 4 + [0.18] * 2 + [0.20] * 4 + [0.15] * 2 + [0.10] * 4
            weights = holiday_weights
        else:
            # 工作日模式：晚上7-11点高峰
            weekday_weights = [0.02] * 6 + [0.05] * 2 + [0.08] * 4 + [0.12] * 2 + [0.15] * 4 + [0.08] * 2 + [0.05] * 4

            # 周末模式：下午2-6点和晚上8-11点高峰
            weekend_weights = [0.03] * 6 + [0.08] * 2 + [0.12] * 4 + [0.15] * 2 + [0.10] * 2 + [0.15] * 3 + [0.08] * 5

            # 随机选择模式（70%工作日，30%周末）
            if np.random.random() < 0.7:
                weights = weekday_weights
            else:
                weights = weekend_weights

        # 归一化权重
        total_weight = sum(weights)
        return [w / total_weight for w in weights]

    def calculate_enhanced_preference_score(self, video_labels, user_favorite_tags, user_gender):
        """计算增强版的用户对视频的偏好分数（基于enhanced_p12的性别偏好）"""
        if not video_labels or not user_favorite_tags:
            return 1.0

        # 解析视频标签
        video_tag_list = [tag.strip() for tag in str(video_labels).split(';') if tag.strip()]

        # 解析用户喜爱标签
        if isinstance(user_favorite_tags, str):
            try:
                user_tag_list = json.loads(user_favorite_tags)
            except:
                user_tag_list = []
        else:
            user_tag_list = user_favorite_tags

        if not user_tag_list:
            return 1.0

        # 计算基础标签匹配度
        common_tags = set(video_tag_list) & set(user_tag_list)
        if not common_tags:
            return 0.3  # 没有共同标签时降低偏好

        # 应用性别偏好权重
        preference_score = 0
        gender_weights = self.gender_preferences.get(user_gender, {})

        for tag in video_tag_list:
            base_score = 1.0
            if tag in user_tag_list:
                base_score = 1.5  # 标签匹配加分

            # 应用性别偏好权重
            if tag in gender_weights:
                base_score *= gender_weights[tag]

            preference_score += base_score

        # 归一化分数
        preference_score = preference_score / len(video_tag_list)

        return min(preference_score, 2.5)  # 限制最大偏好分数

    def generate_enhanced_user_viewlogs(self, user_row):
        """为单个用户生成增强版的观看日志"""
        user_id = user_row['user_id']
        user_gender = user_row['gender']
        favorite_tags = user_row['favorite_tags']

        # 生成每日观看数量（基于用户平均观看时长）
        avg_watch_minutes = user_row['avg_watch_minutes']
        # 假设平均每个视频30秒，计算每日观看数量
        daily_watch_count = max(1, int(avg_watch_minutes * 60 / 30))

        # 生成观看时间分布
        hour_weights = self.get_hour_weights(False)

        viewlogs = []
        used_videos = set()  # 避免同一用户重复观看同一视频

        for _ in range(min(daily_watch_count, len(self.videos_df))):
            # 随机选择视频（避免重复）
            available_videos = [i for i in range(len(self.videos_df)) if i not in used_videos]
            if not available_videos:
                break

            video_idx = np.random.choice(available_videos)
            used_videos.add(video_idx)
            video = self.videos_df.iloc[video_idx]

            # 计算用户对视频的偏好分数（使用增强版算法）
            preference_score = self.calculate_enhanced_preference_score(
                video['labels'], favorite_tags, user_gender
            )

            # 根据偏好分数调整观看概率
            if preference_score < 0.5 and np.random.random() > 0.3:
                continue  # 30%概率跳过不喜欢的视频

            # 生成观看时间
            hour = np.random.choice(range(24), p=hour_weights)
            watch_time = datetime.now().replace(hour=hour, minute=np.random.randint(0, 60), second=np.random.randint(0, 60))

            # 生成观看时长（基于偏好分数）
            base_duration = video['duration']  # 视频时长已经是毫秒
            
            if preference_score > 1.5:
                # 高偏好：更可能看完整个视频
                watch_duration = min(base_duration, np.random.randint(int(base_duration * 0.8), base_duration + 1))
            elif preference_score > 1.0:
                # 中等偏好：看大部分内容
                watch_duration = np.random.randint(int(base_duration * 0.5), int(base_duration * 0.8))
            else:
                # 低偏好：更可能提前退出
                watch_duration = np.random.randint(5000, int(base_duration * 0.6))  # 至少5秒

            # 生成互动行为（基于偏好分数）
            base_like_prob = 0.1
            base_favorite_prob = 0.05
            base_repost_prob = 0.02
            
            # 根据偏好分数调整互动概率
            like_prob = min(base_like_prob * preference_score, 1.0)
            favorite_prob = min(base_favorite_prob * preference_score, 1.0)
            repost_prob = min(base_repost_prob * preference_score, 1.0)

            # 生成关注状态（基于用户对作者的偏好）
            follow_prob = 0.05 if preference_score > 1.5 else 0.02
            is_follow = int(np.random.random() < follow_prob)
            
            viewlog = {
                # vid：视频唯一标识（Video ID）
                # 技术细节：视频在系统中的唯一标识符，用于关联视频表和用户行为表
                'vid': video['vid'],
                
                # title：视频标题
                # 技术细节：视频的标题信息，用于内容理解和推荐算法特征提取
                'title': video['title'],
                
                # category：视频分类信息
                # 技术细节：视频的内容分类，用于分类推荐和内容过滤
                'category': video['category'],
                
                # author：作者（上传者）昵称或ID
                # 技术细节：视频创作者标识，用于作者关注度和内容质量评估
                'author': video['author'],
                
                # publish_time：发布时间（ISO 格式时间戳或Unix时间戳）
                # 技术细节：视频发布时间，用于时效性分析和热门内容识别
                'publish_time': video['publish_time'],
                
                # duration：视频时长（单位：毫秒）
                # 技术细节：视频总时长，用于观看完成率计算和用户偏好分析
                'duration': video['duration'],
                
                # likes：被点赞次数
                # 技术细节：视频累计获得的点赞数，用于热度排序和内容质量评估
                'likes': video['likes'],
                
                # favorites：被收藏次数
                # 技术细节：视频累计获得的收藏数，用于用户兴趣分析和内容推荐
                'favorites': video['favorites'],
                
                # reposts：被转发/转载次数
                # 技术细节：视频累计获得的转发数，用于传播效果分析和内容影响力评估
                'reposts': video['reposts'],
                
                # labels：视频标签（通常是一个或多个标签，用逗号或分号分隔）
                # 技术细节：视频内容标签，用于内容匹配和个性化推荐
                'labels': video['labels'],
                
                # play_time：被播放次数（播放量）
                # 技术细节：视频累计播放次数，用于热度排序和推荐权重计算
                'play_time': video.get('play_count', np.random.randint(100, 10000)),
                
                # play_duration：总播放时长（所有用户观看时长的总和，单位：毫秒）
                # 技术细节：所有用户观看该视频的累计时长，用于内容质量评估
                'play_duration': video.get('total_watch_duration', np.random.randint(10000, 1000000)),
                
                # is_like：当前用户是否已点赞（布尔值：1/0 或 true/false）
                # 技术细节：用户对视频的点赞状态，用于用户行为分析和推荐优化
                'is_like': int(np.random.random() < like_prob),
                
                # is_follow：当前用户是否已关注作者（布尔值：1/0 或 true/false）
                # 技术细节：用户对作者的关注状态，用于社交推荐和内容分发
                'is_follow': is_follow,
                
                # is_share：当前用户是否已分享/转发（布尔值：1/0 或 true/false）
                # 技术细节：用户对视频的分享状态，用于传播分析和内容推荐
                'is_share': int(np.random.random() < repost_prob)
            }

            viewlogs.append(viewlog)

        return viewlogs

# 读取数据
print("正在读取增强版视频和用户数据...")
try:
    videos = pd.read_csv(video_file)
    users = pd.read_csv(user_file)
    print(f"✅ 视频数据: {len(videos)} 条")
    print(f"✅ 用户数据: {len(users)} 条")
except FileNotFoundError as e:
    print(f"❌ 文件未找到: {e}")
    print("请确保 enhanced_videos.csv 和 enhanced_users.csv 文件存在于 ../data/ 目录中")
    sys.exit(1)

# 创建生成器
generator = EnhancedViewlogGenerator(videos, users)

# 生成观看日志
print(f"\n正在生成增强版观看日志 (目标: {output_size} 条)...")
all_viewlogs = []

for idx, user in users.iterrows():
    if idx % 10 == 0:
        print(f"处理用户 {idx+1}/{len(users)}...")

    user_viewlogs = generator.generate_enhanced_user_viewlogs(user)
    all_viewlogs.extend(user_viewlogs)

    # 如果达到目标数量就停止
    if len(all_viewlogs) >= output_size:
        break

# 截取到目标数量
all_viewlogs = all_viewlogs[:output_size]

# 转换为DataFrame
df_viewlogs = pd.DataFrame(all_viewlogs)

# 导出保存
import os
os.makedirs(os.path.dirname(viewlogs_file), exist_ok=True)
df_viewlogs.to_csv(viewlogs_file, index=False, encoding='utf-8-sig')
print("\n✅ 增强版观看日志生成完成！")
print(f"📊 前10条数据预览：")
print(df_viewlogs[['vid', 'title', 'category', 'author', 'publish_time', 'duration', 
                  'likes', 'favorites', 'reposts', 'labels', 'play_time', 'play_duration',
                  'is_like', 'is_follow', 'is_share']].head(10))
print(f'\n💾 已生成 short-video-recommandation-algorithms-master/data/enhanced_viewlogs.csv，共 {len(df_viewlogs)} 条记录。')

# 增强版统计信息
print(f"\n📈 增强版统计信息:")
print(f"总观看次数: {len(df_viewlogs)}")
print(f"平均视频时长: {df_viewlogs['duration'].mean():.2f} 毫秒")
print(f"平均播放时长: {df_viewlogs['play_duration'].mean():.2f} 毫秒")
print(f"平均点赞数: {df_viewlogs['likes'].mean():.2f}")
print(f"平均收藏数: {df_viewlogs['favorites'].mean():.2f}")
print(f"平均转发数: {df_viewlogs['reposts'].mean():.2f}")
print(f"平均播放量: {df_viewlogs['play_time'].mean():.2f}")

# 用户行为统计
print(f"\n👤 用户行为统计:")
print(f"点赞率: {df_viewlogs['is_like'].mean():.3f}")
print(f"关注率: {df_viewlogs['is_follow'].mean():.3f}")
print(f"分享率: {df_viewlogs['is_share'].mean():.3f}")

# 视频热度分布
print(f"\n🔥 视频热度分布:")
video_watch_counts = df_viewlogs.groupby('vid').size()
print(f"平均每视频观看次数: {video_watch_counts.mean():.2f}")
print(f"最多观看次数: {video_watch_counts.max()}")
print(f"最少观看次数: {video_watch_counts.min()}")

# 分类分布
print(f"\n📂 视频分类分布:")
category_counts = df_viewlogs['category'].value_counts()
print(category_counts.head(10))

print(f"\n🎯 生成完成！新文件: ../short-video-recommandation-algorithms-master/data/enhanced_viewlogs.csv")
